iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 4
0
Mobile Development

RxSwift / 30天探索之旅系列 第 4

第 4 天 - Observable (下)

  • 分享至 

  • xImage
  •  

嗨,今天繼續我們繼續講Observable。

其他建立Observable的方式

昨天在建立Observable時,有介紹到.of.interval,其實建立一個Observable有很多方式,今天介紹幾個我常用的,沒介紹到的就再請自己到ReactiveX - Operators看囉,我們開始吧!

just

單一物件的Observable(像是String, [String]或是自訂的Student都可以),當要把一個pure value轉成Observable時就可以用,像是bool

let observable = Observable.just(true)
// — - true — - | ->

from

.from有兩個功能,

  1. .from(array: [_]),可以把陣列轉成Observable,注意一點,結果是把陣列逐一發送每個元素
let observable = Observable.from([1, 3, 7])
// - - 1 - - 3 - - 7 — - | ->
  1. .from(optional: _?),如果optional types變數不為nil,就發送
let number: Int? = 5
let observable = Observable.from(optional: number)

// - - 5 - - | -> number為5的情況
// - - | -> number為nil的情況

never

不會發送也不會結束的Observable,在一些情境可能會用到,像我自己公司是用MVVMC架構,在root coordinator的func start(),因為不會結束,所以return了一個.never(),其他情境,等我道行在高一點,再來分享。

let observable: Observable<Int> = .never()

empty

只會發送.completed的Observable,在測試的時候會用到,或是一些情境你想快點結束Observable,可以用到。

let observable: Observable<Int> = .empty()

error

只會發送.error的Observable,在測試的時候比較常用到。

let error = NSError.init(domain: "測試", code: -1, userInfo: nil)
let observable: Observable<Int> = .error(error)

create

.create提供你客製化Observable方式,我通常會寫成function,在需要自訂成功、失敗條件時很好用,舉個例子,.isEven(number: Int)給定一個數字,判別是不是偶數,若是,就把該數字以Observable形式發送回來;若不是,就發送.error

func isEven(number: Int) -> Observable<Int> {
    // 1
    return Observable.create { observer in
        
        if number % 2 == 0 {
			  // 2
            observer.onNext(number)
            observer.onCompleted()
        } else {
			  // 3
            observer.onError(NSError.init(domain: "不是偶數", code: 401, userInfo: nil))
        }
        // 4
        return Disposables.create()
        
    }
}
  1. .create參數中會有一個subscribe closure,這closure有一參數為observer,並且要使用它來表達對訂閱者發送行為
  2. .onNext.onCompleted來發送成功的行為
  3. .onError來發送失敗的行為
  4. 最後需要返回一個Disposable對象,使用它來取消訂閱,回收Observable所佔用的資源

今天補充介紹了如何建立Observable,明天要介紹Subject,明天再說,掰


上一篇
第 3 天 - Observable (上)
下一篇
第 5 天 - Subject (上)
系列文
RxSwift / 30天探索之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言